package reflect;

import jdk.nashorn.internal.codegen.MethodEmitter;

import java.lang.reflect.Method;

/*
* 反射机制可以强行访问你的private修饰的属性或方法
* */
public class reflectDemo6 {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        //p.heihei();

        Class cls = Class.forName("reflect.Person");    //获取类对象
        Object o = cls.newInstance();    //获取类的实例

        //Method method = cls.getMethod("heihei");
        //method.invoke(o);   //通过o这个实例调用其中的heihei方法
        //结果 会爆出错误，告诉我们没有查找到这个方法
        /*
        * getMethode()和getMethods()方法获取到是该类中的所有公开方法(包含继承过来的方法)
        * getDeclaredMethod()和getDeclaredMethods()
        * 获取的是该类自己定义的方法(包含自己定义的私有方法，但是不包含继承的方法)
        * */
        //Method m = cls.getDeclaredMethod("heihie");
        //m.invoke(o);
        //结果:此时我们就可以获取到了类中定义的私有方法heihie，但是还是不可以在外部直接访问

        Method m = cls.getDeclaredMethod("heihei");
        m.setAccessible(true); //暴力反射 强行打开类中所有方法的使用权限
        m.invoke(o);
        m.setAccessible(false); //关闭访问全部的权限
    }
}
